/**
 * Created by Jack Xue on 20101024
 */
package org.code.jack.jweberp.dao;

import java.io.Serializable;
import java.util.List;

public interface IGenericDao<T> {
	
	/**
	 * 持久化一个实体对象
	 * @param obj
	 */
	void persistEntity(T obj);
	
	/**
	 * 得到一个实体对象
	 * @param id
	 * @return
	 */
	T getEntity(Serializable id);
	
	/**
	 * 同步(更新)一个实体对象
	 * @param obj
	 */
	boolean mergeEntity(T obj);
	
	/**
	 * 移除一个实体对象
	 * @param id
	 */
	boolean removeEntity(Serializable id);
	
	/**
	 * 通过指定对象属性查询对象
	 * @param propertyName
	 * @param value
	 * @param expression
	 * @return
	 */
	T getEntityByField(final String propertyName, final Object value, final String expression);
	
	/**
	 * 通过执行一条SQL语句来查找类型为T的对象,同时也可写成像JPQL查询方式,只有当参数1为JPQL写法时参数2才有效
	 * 
	 * @param sql
	 *            SQL语句
	 * @param params
	 *            查询条件中的参数的值。使用Object数组，要求顺序和查询条件中的参数位置一致。
	 * @param begin
	 *            开始查询的位置
	 * @param max
	 *            需要查询的对象的个数
	 * @return 一个该类型对象的List对象，如果没有查到任何数据，返回一个空的List对象。
	 */
	List<T> findBySql(final String sql, final Object[] params, final int begin, final int max);

	/**
	 * 根据一个查询条件及其参数，还有开始查找的位置和查找的个数来查找类型为T的对象。
	 * 
	 * @param query
	 *            查询的条件，使用位置参数，对象名统一为obj，查询条件从where后开始。比如：obj.name = ?1 and obj.properties = ?2
	 * @param params
	 *            查询条件中的参数的值。使用Object数组，要求顺序和查询条件中的参数位置一致。
	 * @param begin
	 *            开始查询的位置
	 * @param max
	 *            需要查询的对象的个数
	 * @return 一个该类型对象的List对象，如果没有查到任何数据，返回一个空的List对象。
	 */
	// List<T> findByJPQL(final String jpql, final Object[] params, final int begin, final int max);
	List<T> findByJPQL();

}
